// 系统变量
class systemAccess {
  constructor(ctx) {
    ctx = ctx || {};
    this._mfutil = ctx._that || '';
    this.systemParameters = {};
    // 缓存,这里使用的是淘宝云函数的云网关缓存机制 https://miniapp.open.taobao.com/docV3.htm?docId=118535&docType=1&tag=dev
    // 获取类型
    this._cacheType = 1;
    // 缓存时长 单位:秒
    this._cacheTime = 300;
  }

  /**
   * 获取系统变量
   * @param ket 变量名称
   * @param status 0 本地返回 1 接口返回（有缓存）2 数据库返回
   */
  async get(key, status = 0) {
    try {
      if (!key) {
        console.log('%c systemAccess key 不能为空!', 'color: red');
      }
      //  是否从数据库获取
      if (status === 1) {
        return await this._getValueByKeyCloud(key);
      } else if (status === 2) {
        return await this._getValueByKeyDB(key);
      } else {
        return (this.systemParameters[key] ? this.systemParameters[key] : await this._getValueByKeyCloud(key));
      }
    } catch (e) {
      throw new Error(e);
    }
  }

  // 接口查询 会有缓存
  async _getValueByKeyCloud(key, cacheType = this._cacheType, cacheTime = this._cacheTime) {
    return new Promise(async (resolve, reject) => {
      const res = await this._mfutil.cloud.ajax({
        name: 'systemAccessCloud',
        data: {
          key,
        },
        handler: 'getValueByKey',
        exts: {
          cacheType,
          cacheTime
        },
      }, 'cloud_fun');
      if (!res.errCode) {
        let value = res.data;
        this.systemParameters[key] = value
        resolve(value);
      } else {
        reject(res);
      }
    });
  }

  // 数据库查询改为接口无缓存查询,因为需要废弃前端直接调用数据库操作 2021年04月12日11:26:19
  async _getValueByKeyDB(key) {
    return new Promise(async (resolve, reject) => {
      let res = await this._mfutil.cloud.ajax({
        name: 'systemAccessCloud',
        data: {
          key,
        },
        handler: 'getValueByKey',
      }, 'cloud_fun');
      if (!res.errCode) {
        let value = res.data;
        this.systemParameters[key] = value
        resolve(value);
      } else {
        reject(res);
      }
    });
  }

}

module.exports = exports.systemAccess = systemAccess;